P4 trachea sample collected on Oct18 2018. epithelial subset
library(Seurat)
library(dplyr)
basal, secretory, and ciliated:
P4_10X_mm10_1.2.0 <- SetAllIdent(object = P4_10X_mm10_1.2.0, id = "res.0.8")
P4_Oct18_epi<-SubsetData(object=P4_10X_mm10_1.2.0,ident.use=c(1:5,8,11))
table(P4_Oct18_epi@meta.data$res.0.8,P4_Oct18_epi@meta.data$seq_group)
    
     P4_Oct18_mut_green P4_Oct18_mut_red P4_Oct18_wt_green P4_Oct18_wt_red
  1                 225                0               149               2
  11                107                0                58               1
  2                  28                0               278               1
  3                 163                0               143               0
  4                 285                0                11               0
  5                 167                0               125               0
  8                 195                0                24               0
colnames(P4_Oct18_epi@meta.data)[colnames(P4_Oct18_epi@meta.data) == 'res.0.8'] <- 'orig.0.8'
P4_Oct18_epi <- ScaleData(object = P4_Oct18_epi)
Scaling data matrix

  |                                                                                                                                                  
  |                                                                                                                                            |   0%
  |                                                                                                                                                  
  |============================================================================================================================================| 100%
P4_Oct18_epi <- FindVariableGenes(object = P4_Oct18_epi, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

run PCA on the set of genes
P4_Oct18_epi <- RunPCA(object = P4_Oct18_epi, do.print = FALSE)
PCAPlot(P4_Oct18_epi)

P4_Oct18_epi <- ProjectPCA(object = P4_Oct18_epi, do.print = F)
PCElbowPlot(object = P4_Oct18_epi)

PCHeatmap(object = P4_Oct18_epi, pc.use = 1:20, cells.use = 500, do.balanced = TRUE, label.columns = FALSE, num.genes = 25)

n.pcs.sub = 16
res.used <- 0.8
P4_Oct18_epi <- FindClusters(object = P4_Oct18_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
P4_Oct18_epi <- RunTSNE(object = P4_Oct18_epi, dims.use = 1:n.pcs.sub, perplexity=30)
TSNEPlot(object = P4_Oct18_epi, do.label = T,pt.size = 0.4,group.by="res.0.8")

P4_Oct18_epi@meta.data$cell_type<-mapvalues(P4_Oct18_epi@meta.data$res.0.8,from=c("0","1","2","3","4","5","6","7","8","9"),to=c("Secretory","Secretory","Ciliated","Secretory","CiliaSecretory","Secretory","Basal","Basal","Ciliated","Ciliated"))
P4_epi_cellType<-P4_Oct18_epi@meta.data$cell_type
names(P4_epi_cellType)<-P4_Oct18_epi@cell.names
#this will be used in P4Oct_mm10_1_2_0_EC2.Rmd
ggplot(data=P4_Oct18_epi@meta.data,aes(genotype,fill=cell_type))+ 
    geom_bar(position="fill")+ theme(axis.text.x = element_text(angle = 45, hjust = 1))

table(P4_Oct18_epi@meta.data$cell_type,P4_Oct18_epi@meta.data$genotype)
                
                 mut  wt
  Basal          143 145
  CiliaSecretory 119  68
  Ciliated       267 203
  Secretory      641 376
compare between genotypes:
DE_P4_ciliated_genotype<-FindMarkers(P4_Oct18_epi,cells.1<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="wt" & P4_Oct18_epi@meta.data$cell_type=="Ciliated" )),cells.2<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="mut" & P4_Oct18_epi@meta.data$cell_type=="Ciliated" )),only.pos = F,logfc.threshold=0,min.pct=0.05)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 58s      
   |+                                                 | 2 % ~02m 54s      
   |++                                                | 3 % ~02m 51s      
   |++                                                | 4 % ~02m 48s      
   |+++                                               | 5 % ~02m 43s      
   |+++                                               | 6 % ~02m 42s      
   |++++                                              | 7 % ~02m 47s      
   |++++                                              | 8 % ~02m 43s      
   |+++++                                             | 9 % ~02m 39s      
   |+++++                                             | 10% ~02m 37s      
   |++++++                                            | 11% ~02m 35s      
   |++++++                                            | 12% ~02m 32s      
   |+++++++                                           | 13% ~02m 29s      
   |+++++++                                           | 14% ~02m 28s      
   |++++++++                                          | 15% ~02m 25s      
   |++++++++                                          | 16% ~02m 23s      
   |+++++++++                                         | 17% ~02m 21s      
   |+++++++++                                         | 18% ~02m 19s      
   |++++++++++                                        | 19% ~02m 17s      
   |++++++++++                                        | 20% ~02m 15s      
   |+++++++++++                                       | 21% ~02m 13s      
   |+++++++++++                                       | 22% ~02m 11s      
   |++++++++++++                                      | 23% ~02m 09s      
   |++++++++++++                                      | 24% ~02m 08s      
   |+++++++++++++                                     | 25% ~02m 06s      
   |+++++++++++++                                     | 26% ~02m 04s      
   |++++++++++++++                                    | 27% ~02m 02s      
   |++++++++++++++                                    | 28% ~02m 00s      
   |+++++++++++++++                                   | 29% ~01m 59s      
   |+++++++++++++++                                   | 30% ~01m 57s      
   |++++++++++++++++                                  | 31% ~01m 55s      
   |++++++++++++++++                                  | 32% ~01m 54s      
   |+++++++++++++++++                                 | 33% ~01m 52s      
   |+++++++++++++++++                                | 34% ~01m 50s      
   |++++++++++++++++++                                | 35% ~01m 48s      
   |++++++++++++++++++                                | 36% ~01m 47s      
   |+++++++++++++++++++                               | 37% ~01m 45s      
   |+++++++++++++++++++                               | 38% ~01m 43s      
   |++++++++++++++++++++                              | 39% ~01m 42s      
   |++++++++++++++++++++                              | 40% ~01m 40s      
   |+++++++++++++++++++++                             | 41% ~01m 38s      
   |+++++++++++++++++++++                             | 42% ~01m 36s      
   |++++++++++++++++++++++                            | 43% ~01m 35s      
   |++++++++++++++++++++++                            | 44% ~01m 33s      
   |+++++++++++++++++++++++                           | 45% ~01m 31s      
   |+++++++++++++++++++++++                           | 46% ~01m 30s      
   |++++++++++++++++++++++++                          | 47% ~01m 28s      
   |++++++++++++++++++++++++                          | 48% ~01m 26s      
   |+++++++++++++++++++++++++                         | 49% ~01m 25s      
   |+++++++++++++++++++++++++                         | 50% ~01m 23s      
   |++++++++++++++++++++++++++                        | 51% ~01m 21s      
   |++++++++++++++++++++++++++                        | 52% ~01m 20s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 18s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 16s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 15s      
   |++++++++++++++++++++++++++++                     | 56% ~01m 13s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 11s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 10s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 08s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 06s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 05s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 03s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 02s      
   |++++++++++++++++++++++++++++++++                  | 64% ~60s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~58s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~57s          
   |++++++++++++++++++++++++++++++++++                | 67% ~55s          
   |++++++++++++++++++++++++++++++++++               | 68% ~53s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~52s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~50s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~48s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~47s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~45s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~43s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~42s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~40s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~38s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~37s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~35s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~33s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~32s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~30s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~28s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~23s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 46s
DE_P4_ciliated_genotype
write.table(DE_P4_ciliated_genotype,"DE_P4_ciliated_genotype.txt",sep="\t")
P4_ciliated_automatic_geneList<-DE_P4_ciliated_genotype$gene[DE_P4_ciliated_genotype$p_val_adj<0.001 & abs(DE_P4_ciliated_genotype$avg_logFC)>0.5 & abs(DE_P4_ciliated_genotype$pct.1-DE_P4_ciliated_genotype$pct.2)>0.15]
library(ggrepel)
DE_P4_ciliated_genotype$gene<-rownames(DE_P4_ciliated_genotype)
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_P4_ciliated_genotype$threshold<- ifelse(DE_P4_ciliated_genotype$avg_logFC>0 & DE_P4_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_P4_ciliated_genotype$avg_logFC<0 & DE_P4_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_P4_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
  scale_color_manual(values=c("green", "black","magenta"))+
    ggtitle("P4Ciliated_wt/mut") + geom_text_repel(data=DE_P4_ciliated_genotype[DE_P4_ciliated_genotype$gene %in% P4_ciliated_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") 

DE_P4_ciliated_genotype[DE_P4_ciliated_genotype$gene %in% geneList$Primary.ciliary.dyskinesia,]
DE_P4_basal_genotype<-FindMarkers(P4_Oct18_epi,cells.1<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="wt" & P4_Oct18_epi@meta.data$cell_type=="Basal" )),cells.2<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="mut" & P4_Oct18_epi@meta.data$cell_type=="Basal" )),only.pos = F,logfc.threshold=0,min.pct=0.05)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 11s      
   |+                                                 | 2 % ~02m 03s      
   |++                                                | 3 % ~02m 04s      
   |++                                                | 4 % ~02m 01s      
   |+++                                               | 5 % ~02m 01s      
   |+++                                               | 6 % ~01m 58s      
   |++++                                              | 7 % ~01m 58s      
   |++++                                              | 8 % ~01m 56s      
   |+++++                                             | 9 % ~01m 55s      
   |+++++                                             | 10% ~01m 53s      
   |++++++                                            | 11% ~01m 52s      
   |++++++                                            | 12% ~01m 51s      
   |+++++++                                           | 13% ~01m 50s      
   |+++++++                                           | 14% ~01m 48s      
   |++++++++                                          | 15% ~01m 47s      
   |++++++++                                          | 16% ~01m 45s      
   |+++++++++                                         | 17% ~01m 45s      
   |+++++++++                                         | 18% ~01m 43s      
   |++++++++++                                        | 19% ~01m 42s      
   |++++++++++                                        | 20% ~01m 40s      
   |+++++++++++                                       | 21% ~01m 39s      
   |+++++++++++                                       | 22% ~01m 38s      
   |++++++++++++                                      | 23% ~01m 37s      
   |++++++++++++                                      | 24% ~01m 35s      
   |+++++++++++++                                     | 25% ~01m 34s      
   |+++++++++++++                                     | 26% ~01m 33s      
   |++++++++++++++                                    | 27% ~01m 32s      
   |++++++++++++++                                    | 28% ~01m 30s      
   |+++++++++++++++                                   | 29% ~01m 29s      
   |+++++++++++++++                                   | 30% ~01m 27s      
   |++++++++++++++++                                  | 31% ~01m 26s      
   |++++++++++++++++                                  | 32% ~01m 25s      
   |+++++++++++++++++                                 | 33% ~01m 24s      
   |+++++++++++++++++                                | 34% ~01m 22s      
   |++++++++++++++++++                                | 35% ~01m 21s      
   |++++++++++++++++++                                | 36% ~01m 20s      
   |+++++++++++++++++++                               | 37% ~01m 19s      
   |+++++++++++++++++++                               | 38% ~01m 17s      
   |++++++++++++++++++++                              | 39% ~01m 16s      
   |++++++++++++++++++++                              | 40% ~01m 15s      
   |+++++++++++++++++++++                             | 41% ~01m 14s      
   |+++++++++++++++++++++                             | 42% ~01m 12s      
   |++++++++++++++++++++++                            | 43% ~01m 11s      
   |++++++++++++++++++++++                            | 44% ~01m 10s      
   |+++++++++++++++++++++++                           | 45% ~01m 09s      
   |+++++++++++++++++++++++                           | 46% ~01m 07s      
   |++++++++++++++++++++++++                          | 47% ~01m 06s      
   |++++++++++++++++++++++++                          | 48% ~01m 05s      
   |+++++++++++++++++++++++++                         | 49% ~01m 04s      
   |+++++++++++++++++++++++++                         | 50% ~01m 02s      
   |++++++++++++++++++++++++++                        | 51% ~01m 01s      
   |++++++++++++++++++++++++++                        | 52% ~01m 00s      
   |+++++++++++++++++++++++++++                       | 53% ~59s          
   |+++++++++++++++++++++++++++                       | 54% ~58s          
   |++++++++++++++++++++++++++++                      | 55% ~56s          
   |++++++++++++++++++++++++++++                     | 56% ~55s          
   |+++++++++++++++++++++++++++++                     | 57% ~54s          
   |+++++++++++++++++++++++++++++                     | 58% ~53s          
   |++++++++++++++++++++++++++++++                    | 59% ~51s          
   |++++++++++++++++++++++++++++++                    | 60% ~50s          
   |+++++++++++++++++++++++++++++++                   | 61% ~49s          
   |+++++++++++++++++++++++++++++++                   | 62% ~48s          
   |++++++++++++++++++++++++++++++++                  | 63% ~46s          
   |++++++++++++++++++++++++++++++++                  | 64% ~45s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~44s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~43s          
   |++++++++++++++++++++++++++++++++++                | 67% ~41s          
   |++++++++++++++++++++++++++++++++++               | 68% ~40s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~39s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~38s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~36s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~35s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~34s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~33s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~31s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~30s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~29s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~28s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~26s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~23s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 05s
DE_P4_basal_genotype
write.table(DE_P4_basal_genotype,"DE_P4_basal_genotype.txt",sep="\t")
P4_bassal_automatic_geneList<-DE_P4_basal_genotype$gene[DE_P4_basal_genotype$p_val_adj<0.001 & abs(DE_P4_basal_genotype$avg_logFC)>0.5 & abs(DE_P4_basal_genotype$pct.1-DE_P4_basal_genotype$pct.2)>0.15]
library(ggrepel)

DE_P4_secretory_genotype<-FindMarkers(P4_Oct18_epi,cells.1<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="wt" & P4_Oct18_epi@meta.data$cell_type=="Secretory" )),cells.2<-WhichCells(object=P4_Oct18_epi,cells.use = (P4_Oct18_epi@meta.data$genotype=="mut" & P4_Oct18_epi@meta.data$cell_type=="Secretory" )),only.pos = F,logfc.threshold=0,min.pct=0.05)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05m 56s      
   |+                                                 | 2 % ~05m 59s      
   |++                                                | 3 % ~05m 51s      
   |++                                                | 4 % ~05m 46s      
   |+++                                               | 5 % ~05m 45s      
   |+++                                               | 6 % ~05m 39s      
   |++++                                              | 7 % ~05m 34s      
   |++++                                              | 8 % ~05m 32s      
   |+++++                                             | 9 % ~05m 27s      
   |+++++                                             | 10% ~05m 25s      
   |++++++                                            | 11% ~05m 20s      
   |++++++                                            | 12% ~05m 16s      
   |+++++++                                           | 13% ~05m 13s      
   |+++++++                                           | 14% ~05m 09s      
   |++++++++                                          | 15% ~05m 05s      
   |++++++++                                          | 16% ~05m 01s      
   |+++++++++                                         | 17% ~04m 57s      
   |+++++++++                                         | 18% ~04m 54s      
   |++++++++++                                        | 19% ~04m 50s      
   |++++++++++                                        | 20% ~04m 47s      
   |+++++++++++                                       | 21% ~04m 44s      
   |+++++++++++                                       | 22% ~04m 41s      
   |++++++++++++                                      | 23% ~04m 37s      
   |++++++++++++                                      | 24% ~04m 33s      
   |+++++++++++++                                     | 25% ~04m 29s      
   |+++++++++++++                                     | 26% ~04m 26s      
   |++++++++++++++                                    | 27% ~04m 22s      
   |++++++++++++++                                    | 28% ~04m 18s      
   |+++++++++++++++                                   | 29% ~04m 15s      
   |+++++++++++++++                                   | 30% ~04m 11s      
   |++++++++++++++++                                  | 31% ~04m 08s      
   |++++++++++++++++                                  | 32% ~04m 04s      
   |+++++++++++++++++                                 | 33% ~04m 01s      
   |+++++++++++++++++                                | 34% ~03m 57s      
   |++++++++++++++++++                                | 35% ~03m 54s      
   |++++++++++++++++++                                | 36% ~03m 50s      
   |+++++++++++++++++++                               | 37% ~03m 47s      
   |+++++++++++++++++++                               | 38% ~03m 43s      
   |++++++++++++++++++++                              | 39% ~03m 40s      
   |++++++++++++++++++++                              | 40% ~03m 36s      
   |+++++++++++++++++++++                             | 41% ~03m 32s      
   |+++++++++++++++++++++                             | 42% ~03m 29s      
   |++++++++++++++++++++++                            | 43% ~03m 25s      
   |++++++++++++++++++++++                            | 44% ~03m 22s      
   |+++++++++++++++++++++++                           | 45% ~03m 19s      
   |+++++++++++++++++++++++                           | 46% ~03m 15s      
   |++++++++++++++++++++++++                          | 47% ~03m 12s      
   |++++++++++++++++++++++++                          | 48% ~03m 08s      
   |+++++++++++++++++++++++++                         | 49% ~03m 05s      
   |+++++++++++++++++++++++++                         | 50% ~03m 01s      
   |++++++++++++++++++++++++++                        | 51% ~02m 57s      
   |++++++++++++++++++++++++++                        | 52% ~02m 54s      
   |+++++++++++++++++++++++++++                       | 53% ~02m 50s      
   |+++++++++++++++++++++++++++                       | 54% ~02m 47s      
   |++++++++++++++++++++++++++++                      | 55% ~02m 43s      
   |++++++++++++++++++++++++++++                     | 56% ~02m 39s      
   |+++++++++++++++++++++++++++++                     | 57% ~02m 36s      
   |+++++++++++++++++++++++++++++                     | 58% ~02m 32s      
   |++++++++++++++++++++++++++++++                    | 59% ~02m 29s      
   |++++++++++++++++++++++++++++++                    | 60% ~02m 25s      
   |+++++++++++++++++++++++++++++++                   | 61% ~02m 22s      
   |+++++++++++++++++++++++++++++++                   | 62% ~02m 18s      
   |++++++++++++++++++++++++++++++++                  | 63% ~02m 14s      
   |++++++++++++++++++++++++++++++++                  | 64% ~02m 11s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~02m 07s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~02m 03s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 59s      
   |++++++++++++++++++++++++++++++++++               | 68% ~01m 56s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 52s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 48s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 45s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 41s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 38s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 34s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 30s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01m 27s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01m 23s      
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~01m 19s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01m 16s      
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~01m 12s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01m 09s      
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01m 05s      
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01m 01s      
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~58s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~54s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~50s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~47s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~43s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~40s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~36s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~32s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~29s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05m 57s
DE_P4_secretory_genotype
write.table(DE_P4_secretory_genotype,"DE_P4_secretory_genotype.txt",sep="\t")
P4_sec_automatic_geneList<-DE_P4_secretory_genotype$gene[DE_P4_secretory_genotype$p_val_adj<0.001 & abs(DE_P4_secretory_genotype$avg_logFC)>0.5 & abs(DE_P4_secretory_genotype$pct.1-DE_P4_secretory_genotype$pct.2)>0.15]
library(ggrepel)
DE_P4_secretory_genotype$gene<-rownames(DE_P4_secretory_genotype)
DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
volc = ggplot(DE_P4_secretory_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=sig),size=0.1) + #add points colored by significance
    scale_color_manual(values=c("black", "red")) + 
    ggtitle("P4secretory_wt/mut") + geom_text_repel(data=DE_P4_secretory_genotype[DE_P4_secretory_genotype$gene %in% P4_sec_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") + 
  scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))

P4_sec_geneList<-c("Itln1","Retnla","Chil4","Clca1","Cxcl15","Fcgbp","Nfkbia","Hspa5","Ly6k","Ifrd1","Gm42418","Cxcl2","Nfkbiz","Lcn2","Igfbp3","Crip1","Selenbp1","Tppp3","Lyz2","S100a6","Plac8","AU040972","Klk10","Lyz1","Ly6a","Lgals3","Cxcl17","F3","Krt7","Cp","Tsc22d3","Mt1","Chil1","Krt4","Ptprz1","Ifitm1","Txnip","S100a10","Ly6g6c","Hes1","Cldn3","Klk11","Slpi","Baiap2","Plet1","Scnn1a","Lbp","Ltf","Ptges","Muc4","Atp1b1","Atp7b","Ptp4a1","AA467197")

Interleukins:
VlnPlot(object = P4_Oct18_epi, features.plot = c("Il10","Il11","Il12a","Il13","Il15","Il16","Il17a","Il17b","Il17c","Il17d","Il17f","Il18","Il2","Il21","Il22","Il24","Il25","Il27","Il33","Il34","Il4","Il5","Il6","Il7","Il1a","Il1b","Il31"), nCol = 6,x.lab.rot = T,point.size.use = 0.2,group.by="cell_type", legend.position = "left")
All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.All cells have the same value of feature.

Interferons: very few are expressed
VlnPlot(object = P4_Oct18_epi, features.plot = grep("Ifn",rownames(P4_Oct18_epi@data),value=T), nCol = 3,x.lab.rot = T,point.size.use = 0.2,group.by="cell_type", legend.position = "left")
All cells have the same value of feature.

antimicrobial effectors: wt vs mut

P4_Oct18_epi@meta.data$type_genotype<-as.factor(paste(P4_Oct18_epi@meta.data$cell_type,P4_Oct18_epi@meta.data$genotype,sep="_"))

P4_Oct18_epi<-SetAllIdent(object = P4_Oct18_epi, id = "type_genotype")
P4_Oct18_epi@ident=factor(P4_Oct18_epi@ident,levels(P4_Oct18_epi@ident)[c(1,2,7,8,5,6,3,4)])
DotPlot(object = P4_Oct18_epi, cols.use = c("forestgreen","magenta3"),genes.plot = rev(c("Nfkbia","Nfkbiz","Retnla","Cxcl17","Cxcl15","Ccl20","Areg","Chil4","Muc5b","Muc4","Pigr","Ltf","Lyz2","Slpi","Lcn2","Sftpd","Sftpb","Defb1","Lgals3","Itln1")),x.lab.rot = T,plot.legend = T,group.by = "ident",do.return=T,col.min = -2,col.max = 2)+rotate()+ theme(axis.text.x = element_text(angle = 45, vjust = 1,hjust=1)) #this scales both genotypes together

df_P4_epi<-FetchData(P4_Oct18_epi,c("Spdef","Creb3l1","Scgb3a2","Scgb1a1","Krt4","Krt13","Foxa3","Aqp3","Aqp4","Aqp5","Gp2","Sostdc1","Smoc2","Krt14","Krt15","Krt5","Rac2","Clic3","res.0.8","genotype","seq_group","specific_type","cell_type","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Muc5b","Muc5ac","Chil4","Muc1","Muc2","Muc4","Muc16","Muc20","Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Lgals3","Reg3g","Nod1","Nod2","Ddx58","Ifih1","Dhx58","Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1","Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg","Il2","Il34","Il15","Ifnlr1","Nfkbiz","Nfkbia"))
MicrobialSensing:
for (i in c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Ddx58","Ifih1","Dhx58"))
{
pdf(file = paste("Manuscript/MicrobialSensing_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
antimicrobial effectors:
for (i in c("Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Chil4"))
{
pdf(file = paste("Manuscript/Effectors_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
chemokines:
for (i in c("Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1"))
{
pdf(file = paste("Manuscript/chemokines_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Th2:
for (i in c("Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
{
pdf(file = paste("Manuscript/Th2_genotype/P4/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_P4_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}

res.used <- 1.2
P4_Oct18_epi <- FindClusters(object = P4_Oct18_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
P4_Oct18_epi <- RunTSNE(object = P4_Oct18_epi, dims.use = 1:n.pcs.sub, perplexity=30)
TSNEPlot(object = P4_Oct18_epi, do.label = T,pt.size = 0.4,group.by="res.1.2")

table(P4_Oct18_epi@meta.data$res.0.8,P4_Oct18_epi@meta.data$res.1.2)
   
      0   1  10  11   2   3   4   5   6   7   8   9
  0 311   0   0   0   0   0   0   1   0   3   0   0
  1   0   0   0   0   0 192   0   1   0   0   0 109
  2   0   0   0  33 205   0   0   0   0   0   0   0
  3   0 226   1   0   0   1   0   0   1   0   0   0
  4   0   0   2   0   0   0 185   0   0   0   0   0
  5   0   0   0   0   0   0   0 169   0   0   0   2
  6   0   0   0   0   0   0   0   0 152   0   0   0
  7   0   0   0   0   0   0   0   0   0 136   0   0
  8   0   0   0   0   0   0   0   0   0   0 135   0
  9   0   0  97   0   0   0   0   0   0   0   0   0
res.used <- 1.4
P4_Oct18_epi <- FindClusters(object = P4_Oct18_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
P4_Oct18_epi <- RunTSNE(object = P4_Oct18_epi, dims.use = 1:n.pcs.sub, perplexity=30)
TSNEPlot(object = P4_Oct18_epi, do.label = T,pt.size = 0.4,group.by="res.1.4")

table(P4_Oct18_epi@meta.data$res.0.8,P4_Oct18_epi@meta.data$res.1.4)
   
      0   1  10  11  12  13   2   3   4   5   6   7   8   9
  0   0   0   0   0   0   0   0   0 172   2 141   0   0   0
  1   0   0   0   0   0   0 191   0   0   1   0   0   0 110
  2   0 205   0   0   0  33   0   0   0   0   0   0   0   0
  3 224   0   1   0   1   0   1   0   1   0   1   0   0   0
  4   0   0   2   0   0   0   0 185   0   0   0   0   0   0
  5   0   0   0   0   0   0   0   0   0 169   0   0   0   2
  6   0   0   0  89  63   0   0   0   0   0   0   0   0   0
  7   0   0   0   0   0   0   0   0   0   0   0 136   0   0
  8   0   0   0   0   0   0   0   0   0   0   0   0 135   0
  9   0   0  97   0   0   0   0   0   0   0   0   0   0   0
table(P4_Oct18_epi@meta.data$genotype,P4_Oct18_epi@meta.data$res.1.4)
     
        0   1  10  11  12  13   2   3   4   5   6   7   8   9
  mut 223 135  46  78  64  24 191 117   5 107   3   2  65 110
  wt    1  70  54  11   0   9   1  68 168  65 139 134  70   2
P4_Oct18_epi@meta.data$specific_type<-mapvalues(P4_Oct18_epi@meta.data$res.0.8,from=c("0","1","2","3","4","5","6","7","8","9"),to=c("Secretory","Secretory-Krt4","Ciliated","Secretory-Krt4","CiliaSecretory","Secretory-Krt4","Basal","Basal","Ciliated","Ciliated-Foxn4"))

P4_Oct18_epi@meta.data$specific_type_1.4<-mapvalues(P4_Oct18_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13"),to=c("Secretory","Ciliated","Secretory","CiliaSecretory","Secretory","CyclingSecretory","Secretory","Basal-Sostdc1","Ciliated","Secretory-Krt4","Ciliated","CyclingBasal","Basal","Ciliated"))
to support this identification:

table(P4_Oct18_epi@meta.data$specific_type_1.4,P4_Oct18_epi@meta.data$genotype)
                  
                   mut  wt
  Basal             64   0
  Basal-Sostdc1      2 134
  CiliaSecretory   117  68
  Ciliated         270 203
  CyclingBasal      78  11
  CyclingSecretory 107  65
  Secretory        422 309
  Secretory-Krt4   110   2

save(P4_Oct18_epi,file="P4_epi_mm10.1.2.0.RData")
LS0tCnRpdGxlOiAiUDRfVHJhY2hlYV8xMFhfZXBpdGhlbGlhbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMjIyBQNCB0cmFjaGVhIHNhbXBsZSBjb2xsZWN0ZWQgb24gT2N0MTggMjAxOC4gZXBpdGhlbGlhbCBzdWJzZXQKYGBge3J9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpgYGAKCiMjIyMjIGJhc2FsLCBzZWNyZXRvcnksIGFuZCBjaWxpYXRlZDoKYGBge3J9ClA0XzEwWF9tbTEwXzEuMi4wIDwtIFNldEFsbElkZW50KG9iamVjdCA9IFA0XzEwWF9tbTEwXzEuMi4wLCBpZCA9ICJyZXMuMC44IikKUDRfT2N0MThfZXBpPC1TdWJzZXREYXRhKG9iamVjdD1QNF8xMFhfbW0xMF8xLjIuMCxpZGVudC51c2U9YygxOjUsOCwxMSkpCnRhYmxlKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkcmVzLjAuOCxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHNlcV9ncm91cCkKYGBgCmBgYHtyfQpjb2xuYW1lcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhKVtjb2xuYW1lcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhKSA9PSAncmVzLjAuOCddIDwtICdvcmlnLjAuOCcKClA0X09jdDE4X2VwaSA8LSBTY2FsZURhdGEob2JqZWN0ID0gUDRfT2N0MThfZXBpKQpgYGAKCmBgYHtyfQpQNF9PY3QxOF9lcGkgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBkby5wbG90ID0gVFJVRSwgeC5sb3cuY3V0b2ZmPTAuMSx4LmhpZ2guY3V0b2ZmID0gSW5mLCB5LmN1dG9mZiA9IDAuNSkKYGBgCiMjIyMjI3J1biBQQ0Egb24gdGhlIHNldCBvZiBnZW5lcwpgYGB7cn0KUDRfT2N0MThfZXBpIDwtIFJ1blBDQShvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLnByaW50ID0gRkFMU0UpClBDQVBsb3QoUDRfT2N0MThfZXBpKQpgYGAKCmBgYHtyfQpQNF9PY3QxOF9lcGkgPC0gUHJvamVjdFBDQShvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLnByaW50ID0gRikKYGBgCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpKQpgYGAKYGBge3IsZmlnLmhlaWdodD01MCxmaWcud2lkdGg9MTV9ClBDSGVhdG1hcChvYmplY3QgPSBQNF9PY3QxOF9lcGksIHBjLnVzZSA9IDE6MjAsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDI1KQoKYGBgCgoKYGBge3J9Cm4ucGNzLnN1YiA9IDE2CmBgYApgYGB7cn0KcmVzLnVzZWQgPC0gMC44CmBgYAoKYGBge3J9ClA0X09jdDE4X2VwaSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gUDRfT2N0MThfZXBpLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCAKICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBmb3JjZS5yZWNhbGMgPSBUKQpgYGAKYGBge3J9ClA0X09jdDE4X2VwaSA8LSBSdW5UU05FKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQpUU05FUGxvdChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLmxhYmVsID0gVCxwdC5zaXplID0gMC40LGdyb3VwLmJ5PSJyZXMuMC44IikKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRvLmxhYmVsID0gRixncm91cC5ieT0iZ2Vub3R5cGUiLHB0LnNpemUgPSAwLjQpCmBgYAoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD00MH0KCkRvSGVhdG1hcChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ1IiwiS3J0MTQiLCJTb3N0ZGMxIiwiTWtpNjciLCJUb3AyYSIsIktydDQiLCJLcnQxMyIsIlNwZGVmIiwiQ3JlYjNsMSIsIk11YzVhYyIsIkdwMiIsIkdhbG50NiIsIlB0Z2RyIiwiQ2QxNzciLCJGb3hqMSIsIkZveG40IiwiU2hpc2E4IiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5ID0gInJlcy4wLjgiLGNleC5yb3cgPSAyNSxncm91cC5jZXggPSAzMAogICkKYGBgCgpgYGB7cn0KUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU8LW1hcHZhbHVlcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4wLjgsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiksdG89YygiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJDaWxpYVNlY3JldG9yeSIsIlNlY3JldG9yeSIsIkJhc2FsIiwiQmFzYWwiLCJDaWxpYXRlZCIsIkNpbGlhdGVkIikpCmBgYAoKYGBge3J9ClA0X2VwaV9jZWxsVHlwZTwtUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGUKbmFtZXMoUDRfZXBpX2NlbGxUeXBlKTwtUDRfT2N0MThfZXBpQGNlbGwubmFtZXMKI3RoaXMgd2lsbCBiZSB1c2VkIGluIFA0T2N0X21tMTBfMV8yXzBfRUMyLlJtZApgYGAKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD01fQpnZ3Bsb3QoZGF0YT1QNF9PY3QxOF9lcGlAbWV0YS5kYXRhLGFlcyhnZW5vdHlwZSxmaWxsPWNlbGxfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYApgYGB7cn0KdGFibGUoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGUsUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZSkKYGBgCiMjIyMjIGNvbXBhcmUgYmV0d2VlbiBnZW5vdHlwZXM6CmBgYHtyfQpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZTwtRmluZE1hcmtlcnMoUDRfT2N0MThfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPT0iQ2lsaWF0ZWQiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIgJiBQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkNpbGlhdGVkIiApKSxvbmx5LnBvcyA9IEYsbG9nZmMudGhyZXNob2xkPTAsbWluLnBjdD0wLjA1KQpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZQpgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSwiREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUudHh0IixzZXA9Ilx0IikKYGBgCgoKYGBge3J9ClA0X2NpbGlhdGVkX2F1dG9tYXRpY19nZW5lTGlzdDwtREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZVtERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEgJiBhYnMoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDKT4wLjUgJiBhYnMoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjEtREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjIpPjAuMTVdCmBgYApgYGB7cn0KbGlicmFyeShnZ3JlcGVsKQpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xMn0KREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZTwtcm93bmFtZXMoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUpCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCkRFX1A0X2NpbGlhdGVkX2dlbm90eXBlJHRocmVzaG9sZDwtIGlmZWxzZShERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM+MCAmIERFX1A0X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgInd0X2VucmljaCIsaWZlbHNlKERFX1A0X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQzwwICYgREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAibXV0X2VucmljaCIsIk5vdFNpZ25pZmljYW50IiApICkKZ2dwbG90KERFX1A0X2NpbGlhdGVkX2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJQNENpbGlhdGVkX3d0L211dCIpICsgZ2VvbV90ZXh0X3JlcGVsKGRhdGE9REVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIFA0X2NpbGlhdGVkX2F1dG9tYXRpY19nZW5lTGlzdCxdLCBhZXMobGFiZWw9Z2VuZSksIHBvaW50LnBhZGRpbmcgPSAxLCBib3gucGFkZGluZyA9IC4zKSArCiAgbGFicyh5ID0gZXhwcmVzc2lvbigtbG9nWzEwXSoiICIqImFkanVzdGVkIHB2YWx1ZSIpLCB4ID0gImF2ZyBsb2cgZm9sZCBjaGFuZ2UiKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpIApgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CkRFX1A0X2NpbGlhdGVkX2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX1A0X2NpbGlhdGVkX2dlbm90eXBlKQojREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHNpZzwtREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX1A0X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCmdncGxvdChERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuMikgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiUDRDaWxpYXRlZF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX1A0X2NpbGlhdGVkX2dlbm90eXBlW0RFX1A0X2NpbGlhdGVkX2dlbm90eXBlJGdlbmUgJWluJSBnZW5lTGlzdCRQcmltYXJ5LmNpbGlhcnkuZHlza2luZXNpYSxdLCBhZXMobGFiZWw9Z2VuZSksIHBvaW50LnBhZGRpbmcgPSAxLCBib3gucGFkZGluZyA9IC4zKSArCiAgbGFicyh5ID0gZXhwcmVzc2lvbigtbG9nWzEwXSoiICIqImFkanVzdGVkIHB2YWx1ZSIpLCB4ID0gImF2ZyBsb2cgZm9sZCBjaGFuZ2UiKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpIApgYGAKYGBge3J9CgpERV9QNF9jaWxpYXRlZF9nZW5vdHlwZVtERV9QNF9jaWxpYXRlZF9nZW5vdHlwZSRnZW5lICVpbiUgZ2VuZUxpc3QkUHJpbWFyeS5jaWxpYXJ5LmR5c2tpbmVzaWEsXQpgYGAKCmBgYHtyfQoKREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfUDRfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JENpbGlvcGF0aHksXQpgYGAKCmBgYHtyfQpERV9QNF9iYXNhbF9nZW5vdHlwZTwtRmluZE1hcmtlcnMoUDRfT2N0MThfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPT0iQmFzYWwiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIgJiBQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkJhc2FsIiApKSxvbmx5LnBvcyA9IEYsbG9nZmMudGhyZXNob2xkPTAsbWluLnBjdD0wLjA1KQpERV9QNF9iYXNhbF9nZW5vdHlwZQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKERFX1A0X2Jhc2FsX2dlbm90eXBlLCJERV9QNF9iYXNhbF9nZW5vdHlwZS50eHQiLHNlcD0iXHQiKQpgYGAKCmBgYHtyfQpQNF9iYXNhbF9hdXRvbWF0aWNfZ2VuZUxpc3Q8LURFX1A0X2Jhc2FsX2dlbm90eXBlJGdlbmVbREVfUDRfYmFzYWxfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxICYgYWJzKERFX1A0X2Jhc2FsX2dlbm90eXBlJGF2Z19sb2dGQyk+MC41ICYgYWJzKERFX1A0X2Jhc2FsX2dlbm90eXBlJHBjdC4xLURFX1A0X2Jhc2FsX2dlbm90eXBlJHBjdC4yKT4wLjE1XQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CkRFX1A0X2Jhc2FsX2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX1A0X2Jhc2FsX2dlbm90eXBlKQojREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHNpZzwtREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQpERV9QNF9iYXNhbF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfUDRfYmFzYWxfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9QNF9iYXNhbF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9QNF9iYXNhbF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX1A0X2Jhc2FsX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCmdncGxvdChERV9QNF9iYXNhbF9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuMikgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiUDRCYXNhbF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX1A0X2Jhc2FsX2dlbm90eXBlW0RFX1A0X2Jhc2FsX2dlbm90eXBlJGdlbmUgJWluJSBQNF9iYXNhbF9hdXRvbWF0aWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCgpgYGB7cn0KREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlPC1GaW5kTWFya2VycyhQNF9PY3QxOF9lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9UDRfT2N0MThfZXBpLGNlbGxzLnVzZSA9IChQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiICYgUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJTZWNyZXRvcnkiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PVA0X09jdDE4X2VwaSxjZWxscy51c2UgPSAoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIgJiBQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IlNlY3JldG9yeSIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MC4wNSkKREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlCmBgYApgYGB7cn0Kd3JpdGUudGFibGUoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlLCJERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUudHh0IixzZXA9Ilx0IikKYGBgCgoKYGBge3J9ClA0X3NlY19hdXRvbWF0aWNfZ2VuZUxpc3Q8LURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRnZW5lW0RFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEgJiBhYnMoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJGF2Z19sb2dGQyk+MC41ICYgYWJzKERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwY3QuMS1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcGN0LjIpPjAuMTVdCmBgYApgYGB7cn0KbGlicmFyeShnZ3JlcGVsKQpgYGAKYGBge3J9CkRFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRnZW5lPC1yb3duYW1lcyhERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUpCkRFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRzaWc8LURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEKREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHRocmVzaG9sZDwtIGlmZWxzZShERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAid3RfZW5yaWNoIixpZmVsc2UoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJGF2Z19sb2dGQzwwICYgREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCnZvbGMgPSBnZ3Bsb3QoREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJQNHNlY3JldG9yeV93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZVtERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkZ2VuZSAlaW4lIFA0X3NlY19hdXRvbWF0aWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CnZvbGMKYGBgCgpgYGB7cn0KUDRfc2VjX2dlbmVMaXN0PC1jKCJJdGxuMSIsIlJldG5sYSIsIkNoaWw0IiwiQ2xjYTEiLCJDeGNsMTUiLCJGY2dicCIsIk5ma2JpYSIsIkhzcGE1IiwiTHk2ayIsIklmcmQxIiwiR200MjQxOCIsIkN4Y2wyIiwiTmZrYml6IiwiTGNuMiIsIklnZmJwMyIsIkNyaXAxIiwiU2VsZW5icDEiLCJUcHBwMyIsIkx5ejIiLCJTMTAwYTYiLCJQbGFjOCIsIkFVMDQwOTcyIiwiS2xrMTAiLCJMeXoxIiwiTHk2YSIsIkxnYWxzMyIsIkN4Y2wxNyIsIkYzIiwiS3J0NyIsIkNwIiwiVHNjMjJkMyIsIk10MSIsIkNoaWwxIiwiS3J0NCIsIlB0cHJ6MSIsIklmaXRtMSIsIlR4bmlwIiwiUzEwMGExMCIsIkx5Nmc2YyIsIkhlczEiLCJDbGRuMyIsIktsazExIiwiU2xwaSIsIkJhaWFwMiIsIlBsZXQxIiwiU2NubjFhIiwiTGJwIiwiTHRmIiwiUHRnZXMiLCJNdWM0IiwiQXRwMWIxIiwiQXRwN2IiLCJQdHA0YTEiLCJBQTQ2NzE5NyIpCmBgYAoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xNn0KI0RFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRnZW5lPC1yb3duYW1lcyhERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUpCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkdGhyZXNob2xkPC0gaWZlbHNlKERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRhdmdfbG9nRkM+MCAmIERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkYXZnX2xvZ0ZDPDAgJiBERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAibXV0X2VucmljaCIsIk5vdFNpZ25pZmljYW50IiApICkKZ2dwbG90KERFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuNCkgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiUDRzZWNyZXRvcnlfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGVbREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJGdlbmUgJWluJSBQNF9zZWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMC4wMSwgYm94LnBhZGRpbmcgPSAwLjA1LHNpemU9OCxtYXguaXRlciA9IDYwMDApICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgCmBgYAoKIyMjIyMgSW50ZXJsZXVraW5zOiAKYGBge3IsZmlnLmhlaWdodD0xNiwgZmlnLndpZHRoPTE1fQpWbG5QbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIklsMTAiLCJJbDExIiwiSWwxMmEiLCJJbDEzIiwiSWwxNSIsIklsMTYiLCJJbDE3YSIsIklsMTdiIiwiSWwxN2MiLCJJbDE3ZCIsIklsMTdmIiwiSWwxOCIsIklsMiIsIklsMjEiLCJJbDIyIiwiSWwyNCIsIklsMjUiLCJJbDI3IiwiSWwzMyIsIklsMzQiLCJJbDQiLCJJbDUiLCJJbDYiLCJJbDciLCJJbDFhIiwiSWwxYiIsIklsMzEiKSwgbkNvbCA9IDYseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMixncm91cC5ieT0iY2VsbF90eXBlIiwgbGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKQpgYGAKCiMjIyMjIEludGVyZmVyb25zOiB2ZXJ5IGZldyBhcmUgZXhwcmVzc2VkCgpgYGB7cixmaWcuaGVpZ2h0PTE2LCBmaWcud2lkdGg9MTV9ClZsblBsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBmZWF0dXJlcy5wbG90ID0gZ3JlcCgiSWZuIixyb3duYW1lcyhQNF9PY3QxOF9lcGlAZGF0YSksdmFsdWU9VCksIG5Db2wgPSAzLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjIsZ3JvdXAuYnk9ImNlbGxfdHlwZSIsIGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikKYGBgCgojIyMjIyBhbnRpbWljcm9iaWFsIGVmZmVjdG9yczogd3QgdnMgbXV0CgpgYGB7cixmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTZ9ClNwbGl0RG90UGxvdEdHKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsImZvcmVzdGdyZWVuIiksZ2VuZXMucGxvdCA9IGMoIk11YzEiLCJNdWM0IiwiTXVjMTYiLCJNdWMyMCIsIk11YzViIiwiTXVjNWFjIiwiTXVjMiIsIkRlZmIxIiwiTHl6MiIsIkx0ZiIsIlNmdHBhMSIsIlNmdHBkIiwiU2Z0cGIiLCJTbHBpIiwiTGNuMiIsIlBpZ3IiLCJDaGlsNCIpLGdyb3VwLmJ5PSJjZWxsX3R5cGUiLGdyb3VwaW5nLnZhcj0iZ2Vub3R5cGUiLHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKSAjdGhpcyBzY2FsZXMgZ2Vub3R5cGVzIHNlcGFyYXRlbHkKYGBgCmBgYHtyfQpQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHR5cGVfZ2Vub3R5cGU8LWFzLmZhY3RvcihwYXN0ZShQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZSxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGdlbm90eXBlLHNlcD0iXyIpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTV9ClA0X09jdDE4X2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBpZCA9ICJ0eXBlX2dlbm90eXBlIikKClA0X09jdDE4X2VwaUBpZGVudD1mYWN0b3IoUDRfT2N0MThfZXBpQGlkZW50LGxldmVscyhQNF9PY3QxOF9lcGlAaWRlbnQpW2MoMSwyLDcsOCw1LDYsMyw0KV0pCkRvdFBsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBjb2xzLnVzZSA9IGMoInllbGxvdyIsInJlZCIpLGdlbmVzLnBsb3QgPSByZXYoYygiU2Z0cGExIiwiQ2hpbDQiLCJNdWM1YWMiLCJNdWMyIiwiTXVjMjAiLCJNdWM1YiIsIk11YzEiLCJNdWMxNiIsIk11YzQiLCJQaWdyIiwiTHRmIiwiTHl6MiIsIlNscGkiLCJMY24yIiwiU2Z0cGQiLCJTZnRwYiIsIkRlZmIxIikpLHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBULGdyb3VwLmJ5ID0gImlkZW50Iixkby5yZXR1cm49VCkrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgI3RoaXMgc2NhbGVzIGJvdGggZ2Vub3R5cGVzIHRvZ2V0aGVyCmBgYAoKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD01fQpQNF9PY3QxOF9lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgaWQgPSAidHlwZV9nZW5vdHlwZSIpCgpQNF9PY3QxOF9lcGlAaWRlbnQ9ZmFjdG9yKFA0X09jdDE4X2VwaUBpZGVudCxsZXZlbHMoUDRfT2N0MThfZXBpQGlkZW50KVtjKDEsMiw3LDgsNSw2LDMsNCldKQpEb3RQbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IHJldihjKCJOZmtiaWEiLCJOZmtiaXoiLCJSZXRubGEiLCJDeGNsMTciLCJDeGNsMTUiLCJDY2wyMCIsIkFyZWciLCJDaGlsNCIsIk11YzViIiwiTXVjNCIsIlBpZ3IiLCJMdGYiLCJMeXoyIiwiU2xwaSIsIkxjbjIiLCJTZnRwZCIsIlNmdHBiIiwiRGVmYjEiLCJMZ2FsczMiLCJJdGxuMSIpKSx4LmxhYi5yb3QgPSBULHBsb3QubGVnZW5kID0gVCxncm91cC5ieSA9ICJpZGVudCIsZG8ucmV0dXJuPVQsY29sLm1pbiA9IC0yLGNvbC5tYXggPSAyKStyb3RhdGUoKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLGhqdXN0PTEpKSAjdGhpcyBzY2FsZXMgYm90aCBnZW5vdHlwZXMgdG9nZXRoZXIKYGBgCgpgYGB7cn0KZGZfUDRfZXBpPC1GZXRjaERhdGEoUDRfT2N0MThfZXBpLGMoIlNwZGVmIiwiQ3JlYjNsMSIsIlNjZ2IzYTIiLCJTY2diMWExIiwiS3J0NCIsIktydDEzIiwiRm94YTMiLCJBcXAzIiwiQXFwNCIsIkFxcDUiLCJHcDIiLCJTb3N0ZGMxIiwiU21vYzIiLCJLcnQxNCIsIktydDE1IiwiS3J0NSIsIlJhYzIiLCJDbGljMyIsInJlcy4wLjgiLCJnZW5vdHlwZSIsInNlcV9ncm91cCIsInNwZWNpZmljX3R5cGUiLCJjZWxsX3R5cGUiLCJEZWZiMSIsIkx5ejIiLCJMdGYiLCJTZnRwYTEiLCJTZnRwZCIsIlNmdHBiIiwiU2xwaSIsIkxjbjIiLCJQaWdyIiwiTXVjNWIiLCJNdWM1YWMiLCJDaGlsNCIsIk11YzEiLCJNdWMyIiwiTXVjNCIsIk11YzE2IiwiTXVjMjAiLCJMYnAiLCJDZDE0IiwiVGxyNCIsIlRscjIiLCJNeWQ4OCIsIlRpY2FtMSIsIkl0bG4xIiwiTGdhbHMzIiwiUmVnM2ciLCJOb2QxIiwiTm9kMiIsIkRkeDU4IiwiSWZpaDEiLCJEaHg1OCIsIkNjbDUiLCJDeGNsMTAiLCJDeGNsMiIsIkN4Y2wxIiwiUGY0IiwiQ3hjbDEyIiwiQ3hjbDE0IiwiQ3hjbDE1IiwiQ3hjbDE2IiwiQ3hjbDE3IiwiQ2NsMiIsIkNjbDciLCJDY2wxNyIsIkNjbDIwIiwiQ2NsMjFhIiwiQ2NsMjUiLCJDY2wyN2EiLCJDY2wyOCIsIkN4M2NsMSIsIklsMTAiLCJUbmYiLCJTMTAwYTgiLCJTMTAwYTkiLCJJbDYiLCJJbDE4IiwiSWwxYiIsIklsMXJsMSIsIkNjbDExIiwiQ2NsMjQiLCJJbDMzIiwiSWwyNSIsIlRzbHAiLCJGMnJsMSIsIlJldG5sYSIsIkFsb3gxNSIsIkFsb3g1IiwiR2F0YTIiLCJUZ2ZiMiIsIlRnZmIxIiwiT3JtZGwzIiwiUHRnZXMiLCJQdGdkcyIsIlB0Z3MyIiwiSHBnZHMiLCJUYnhhczEiLCJBcmVnIiwiSWwyIiwiSWwzNCIsIklsMTUiLCJJZm5scjEiLCJOZmtiaXoiLCJOZmtiaWEiKSkKCmBgYAojIyMjIyBNaWNyb2JpYWxTZW5zaW5nOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIkxicCIsIkNkMTQiLCJUbHI0IiwiVGxyMiIsIk15ZDg4IiwiVGljYW0xIiwiSXRsbjEiLCJSZWczZyIsIkxnYWxzMyIsIk5vZDEiLCJOb2QyIiwiRGR4NTgiLCJJZmloMSIsIkRoeDU4IikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9NaWNyb2JpYWxTZW5zaW5nX2dlbm90eXBlL1A0LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfUDRfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAoKIyMjIyMgYW50aW1pY3JvYmlhbCBlZmZlY3RvcnM6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpmb3IgKGkgaW4gYygiTXVjMSIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTXVjNWIiLCJNdWM1YWMiLCJNdWMyIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIkNoaWw0IikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9FZmZlY3RvcnNfZ2Vub3R5cGUvUDQvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9QNF9lcGksYWVzX3N0cmluZyh4PSJnZW5vdHlwZSIseT1pKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKSkKZGV2Lm9mZigpCn0KYGBgCiMjIyMjIGNoZW1va2luZXM6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpmb3IgKGkgaW4gYygiQ2NsNSIsIkN4Y2wxMCIsIkN4Y2wyIiwiQ3hjbDEiLCJQZjQiLCJDeGNsMTIiLCJDeGNsMTQiLCJDeGNsMTUiLCJDeGNsMTYiLCJDeGNsMTciLCJDY2wyIiwiQ2NsNyIsIkNjbDE3IiwiQ2NsMjAiLCJDY2wyMWEiLCJDY2wyNSIsIkNjbDI3YSIsIkNjbDI4IiwiQ3gzY2wxIikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9jaGVtb2tpbmVzX2dlbm90eXBlL1A0LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfUDRfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAojIyMjIyBUaDI6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpmb3IgKGkgaW4gYygiSWwxMCIsIlRuZiIsIlMxMDBhOCIsIlMxMDBhOSIsIklsNiIsIklsMTgiLCJJbDFiIiwiSWwxcmwxIiwiQ2NsMTEiLCJDY2wyNCIsIklsMzMiLCJJbDI1IiwiVHNscCIsIkYycmwxIiwiUmV0bmxhIiwiQWxveDE1IiwiQWxveDUiLCJHYXRhMiIsIlRnZmIyIiwiVGdmYjEiLCJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIlRieGFzMSIsIkFyZWciKSkKewpwZGYoZmlsZSA9IHBhc3RlKCJNYW51c2NyaXB0L1RoMl9nZW5vdHlwZS9QNC8iLGksIi5wZGYiLCBzZXAgPSAiIiksIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSkKcHJpbnQoZ2dwbG90KGRmX1A0X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxOZmtiaWEpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxJdGxuMSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Nn0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLFJlZzNnKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxMZ2FsczMpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsQXFwMykpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxNdWM0KSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsTXVjMjApKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxMY24yKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLENjbDIwKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsQ3hjbDE1KSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLEN4Y2wxNykpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02fQoKZ2dwbG90KGRmX1A0X2VwaSxhZXMoZ2Vub3R5cGUsQ2hpbDQpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Nn0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLFBpZ3IpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxLcnQ0KSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Nn0KCmdncGxvdChkZl9QNF9lcGksYWVzKGdlbm90eXBlLFNvc3RkYzEpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDEsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTZ9CgpnZ3Bsb3QoZGZfUDRfZXBpLGFlcyhnZW5vdHlwZSxLcnQxMykpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgoKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjIKYGBgCgpgYGB7cn0KUDRfT2N0MThfZXBpIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBQNF9PY3QxOF9lcGksIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcy5zdWIsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KUDRfT2N0MThfZXBpIDwtIFJ1blRTTkUob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCBwZXJwbGV4aXR5PTMwKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9ClRTTkVQbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjQsZ3JvdXAuYnk9InJlcy4xLjIiKQpgYGAKYGBge3IsZmlnLmhlaWdodD0xMixmaWcud2lkdGg9MzV9CgpEb0hlYXRtYXAob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBnZW5lcy51c2UgPSBjKCJFcGNhbSIsIlRycDYzIiwiS3J0NSIsIktydDE0IiwiU29zdGRjMSIsIk1raTY3IiwiVG9wMmEiLCJLcnQ0IiwiS3J0MTMiLCJTcGRlZiIsIkNyZWIzbDEiLCJNdWM1YWMiLCJHcDIiLCJHYWxudDYiLCJQdGdkciIsIkNkMTc3IiwiRm94ajEiLCJGb3huNCIsIlNoaXNhOCIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieSA9ICJyZXMuMS4yIixjZXgucm93ID0gMzAsZ3JvdXAuY2V4ID0gMzAKICApCmBgYAoKYGBge3J9CnRhYmxlKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkcmVzLjAuOCxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4xLjIpCmBgYAoKYGBge3J9CnJlcy51c2VkIDwtIDEuNApgYGAKCmBgYHtyfQpQNF9PY3QxOF9lcGkgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgCiAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgZm9yY2UucmVjYWxjID0gVCkKYGBgCmBgYHtyfQpQNF9PY3QxOF9lcGkgPC0gUnVuVFNORShvYmplY3QgPSBQNF9PY3QxOF9lcGksIGRpbXMudXNlID0gMTpuLnBjcy5zdWIsIHBlcnBsZXhpdHk9MzApCmBgYApgYGB7ciwgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0KVFNORVBsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBkby5sYWJlbCA9IFQscHQuc2l6ZSA9IDAuNCxncm91cC5ieT0icmVzLjEuNCIpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTE1LGZpZy53aWR0aD00MH0KRG9IZWF0bWFwKG9iamVjdCA9IFA0X09jdDE4X2VwaSwgZ2VuZXMudXNlID0gYygiRXBjYW0iLCJUcnA2MyIsIktydDUiLCJLcnQxNCIsIkJtcDciLCJTbW9jMiIsIlNvc3RkYzEiLCJDbGljMyIsIk1raTY3IiwiVG9wMmEiLCJTcGRlZiIsIkNyZWIzbDEiLCJLcnQ0IiwiS3J0MTMiLCJDaXRlZDEiLCJLbGsxMCIsIktsazEzIiwiS2xrMTEiLCJEbmFqYjkiLCJNdWMxNiIsIk11YzViIiwiR3AyIiwiVGZmMiIsIkNncmVmMSIsIkdhbG50NiIsIkIzZ250NiIsIlB0Z2RyIiwiQ2QxNzciLCJGb3hqMSIsIkZveG40IiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5ID0gInJlcy4xLjQiLGNleC5yb3cgPSAzMCxncm91cC5vcmRlciA9IGMoMTEsNSw3LDEyLDAsNiw0LDIsOSwxMCw4LDEsMTMsMyksZ3JvdXAuY2V4ID0gMzAKICApCmBgYAoKYGBge3J9CnRhYmxlKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkcmVzLjAuOCxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4xLjQpCmBgYAoKYGBge3J9CnRhYmxlKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGUsUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRyZXMuMS40KQpgYGAKYGBge3J9ClA0X09jdDE4X2VwaUBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZTwtbWFwdmFsdWVzKFA0X09jdDE4X2VwaUBtZXRhLmRhdGEkcmVzLjAuOCxmcm9tPWMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiKSx0bz1jKCJTZWNyZXRvcnkiLCJTZWNyZXRvcnktS3J0NCIsIkNpbGlhdGVkIiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYVNlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiQmFzYWwiLCJCYXNhbCIsIkNpbGlhdGVkIiwiQ2lsaWF0ZWQtRm94bjQiKSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPVA0X09jdDE4X2VwaUBtZXRhLmRhdGEsYWVzKGdlbm90eXBlLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAoKYGBge3J9ClA0X09jdDE4X2VwaUBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZV8xLjQ8LW1hcHZhbHVlcyhQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJHJlcy4xLjQsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiKSx0bz1jKCJTZWNyZXRvcnkiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIkNpbGlhU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiQ3ljbGluZ1NlY3JldG9yeSIsIlNlY3JldG9yeSIsIkJhc2FsLVNvc3RkYzEiLCJDaWxpYXRlZCIsIlNlY3JldG9yeS1LcnQ0IiwiQ2lsaWF0ZWQiLCJDeWNsaW5nQmFzYWwiLCJCYXNhbCIsIkNpbGlhdGVkIikpCmBgYAojIyMjIyB0byBzdXBwb3J0IHRoaXMgaWRlbnRpZmljYXRpb246CmBgYHtyLGZpZy5oZWlnaHQ9MyxmaWcud2lkdGg9OH0KUDRfT2N0MThfZXBpPC1TZXRBbGxJZGVudChvYmplY3QgPSBQNF9PY3QxOF9lcGksIGlkID0gInNwZWNpZmljX3R5cGVfMS40IikKClA0X09jdDE4X2VwaUBpZGVudD1mYWN0b3IoUDRfT2N0MThfZXBpQGlkZW50LGxldmVscyhQNF9PY3QxOF9lcGlAaWRlbnQpW2MoMyw0LDcsOCwxLDIsNiw1KV0pCkRvdFBsb3Qob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBjb2xzLnVzZSA9IGMoImxpZ2h0Z3JleSIsInJlZCIpLGdlbmVzLnBsb3QgPSBjKCJGb3hqMSIsIlB0Z2RyIiwiQjNnbnQ2IiwiR2FsbnQ2IiwiQ2dyZWYxIiwiR3AyIiwiVGZmMiIsIk11YzViIiwiTXVjMTYiLCJDaXRlZDEiLCJLcnQ0IiwiQ3JlYjNsMSIsIlNwZGVmIiwiQ2xpYzMiLCJDY2wyMCIsIlNvc3RkYzEiLCJTbW9jMiIsIktydDE0IiwiQm1wNyIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiKSxncm91cC5ieSA9ICJpZGVudCIsIHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKQpgYGAKYGBge3IsZmlnLmhlaWdodD0zLGZpZy53aWR0aD02LjV9ClA0X09jdDE4X2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gUDRfT2N0MThfZXBpLCBpZCA9ICJzcGVjaWZpY190eXBlXzEuNCIpCgpQNF9PY3QxOF9lcGlAaWRlbnQ9ZmFjdG9yKFA0X09jdDE4X2VwaUBpZGVudCxsZXZlbHMoUDRfT2N0MThfZXBpQGlkZW50KVtjKDMsNCw3LDgsMSwyLDYsNSldKQpEb3RQbG90KG9iamVjdCA9IFA0X09jdDE4X2VwaSwgY29scy51c2UgPSBjKCJsaWdodGdyZXkiLCJyZWQiKSxnZW5lcy5wbG90ID0gYygiRm94ajEiLCJCM2dudDYiLCJDZ3JlZjEiLCJHcDIiLCJUZmYyIiwiTXVjNWIiLCJLcnQ0IiwiQ3JlYjNsMSIsIlNwZGVmIiwiQ2xpYzMiLCJTb3N0ZGMxIiwiU21vYzIiLCJUcnA2MyIsIktydDUiLCJNa2k2NyIsIlRvcDJhIiksZ3JvdXAuYnkgPSAiaWRlbnQiLCB4LmxhYi5yb3QgPSBULHBsb3QubGVnZW5kID0gVCkKYGBgCgpgYGB7cn0KdGFibGUoUDRfT2N0MThfZXBpQG1ldGEuZGF0YSRzcGVjaWZpY190eXBlXzEuNCxQNF9PY3QxOF9lcGlAbWV0YS5kYXRhJGdlbm90eXBlKQpgYGAKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD01fQpnZ3Bsb3QoZGF0YT1QNF9PY3QxOF9lcGlAbWV0YS5kYXRhLGFlcyhnZW5vdHlwZSxmaWxsPXNwZWNpZmljX3R5cGVfMS40KSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CnNhdmUoUDRfT2N0MThfZXBpLGZpbGU9IlA0X2VwaV9tbTEwLjEuMi4wLlJEYXRhIikKYGBgCgoKCgoKCgo=